// $ANTLR 3.4 C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g 2013-02-27 23:30:04

   package practica.analizadoresAntlr;
   import java.util.ArrayList;
   import practica.arboles.*;
   import java.util.Hashtable;
   import java.util.Map;
   import java.util.HashMap;


import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

@SuppressWarnings({"all", "warnings", "unchecked"})
public class ExpresionesEvaluator extends TreeParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ABRIRCORCHETE", "ABRIRPARENTESIS", "ASIGNACION", "ASTERISCO", "BLANCO", "CAMBIO_SIGNO", "CERRARCORCHETE", "CERRARPARENTESIS", "COMENTARIO", "DIGITO", "ID", "LETRA", "MAS", "MENOS", "NUEVA_LINEA", "NUMERO", "SEPARADOR", "SLASH", "DEF_FUNCION", "LISTA_INST", "LLAMADA_FUN"
    };

    public static final int EOF=-1;
    public static final int ABRIRCORCHETE=4;
    public static final int ABRIRPARENTESIS=5;
    public static final int ASIGNACION=6;
    public static final int ASTERISCO=7;
    public static final int BLANCO=8;
    public static final int CAMBIO_SIGNO=9;
    public static final int CERRARCORCHETE=10;
    public static final int CERRARPARENTESIS=11;
    public static final int COMENTARIO=12;
    public static final int DIGITO=13;
    public static final int ID=14;
    public static final int LETRA=15;
    public static final int MAS=16;
    public static final int MENOS=17;
    public static final int NUEVA_LINEA=18;
    public static final int NUMERO=19;
    public static final int SEPARADOR=20;
    public static final int SLASH=21;
    public static final int DEF_FUNCION=22;
    public static final int LISTA_INST=23;
    public static final int LLAMADA_FUN=24;

    // delegates
    public TreeParser[] getDelegates() {
        return new TreeParser[] {};
    }

    // delegators


    public ExpresionesEvaluator(TreeNodeStream input) {
        this(input, new RecognizerSharedState());
    }
    public ExpresionesEvaluator(TreeNodeStream input, RecognizerSharedState state) {
        super(input, state);
    }

    public String[] getTokenNames() { return ExpresionesEvaluator.tokenNames; }
    public String getGrammarFileName() { return "C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g"; }



      Hashtable<String, ArrayList<Float>> variables = new Hashtable<String, ArrayList<Float>> ();
      private ArrayList<MiArbol> funciones;
      private final Map<String, Float> valoresSubArbol = new HashMap<String, Float>();
      private int index = 0;
      private int indexError = -1;
      
      public ExpresionesEvaluator(CommonTreeNodeStream nodes, ArrayList<MiArbol> funciones) {
          this(nodes);
          this.funciones = funciones;
      }

      private ExpresionesEvaluator(MiArbol funcion, ArrayList<MiArbol> funciones, Hashtable<String, ArrayList<Float>> variables, Float parametro) {
        this(new CommonTreeNodeStream(funcion.getChild(2)), funciones);
        this.variables = variables;
        valoresSubArbol.put(funcion.getChild(1).getText(), parametro);
      }
      
      //Funcion para buscar por nombre una funcion en la lista de funciones
      private MiArbol buscarFuncion(String n, Float parametro) {
        for (MiArbol f : this.funciones) {
          if (f.getChild(0).getText().equals(n)) {
            MiArbol id = (MiArbol) f.getChild(1);
            if ((id.getToken().getType() != NUMERO) || (new Float(id.getToken().getText()).equals(parametro))) 
              return f;
          }
        }
        return null;
      }
      
      //Funcion para obtener el valor de una variable
      public Float getValor(String n) {
        Float valor = valoresSubArbol.get(n);
        if (valor != null)
          return valor;
        else {
          valor = variables.get(n).get(index);
          if (valor != null)
            return valor;
        }
        return new Float(0);
      }
      



    // $ANTLR start "entrada"
    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:68:1: entrada returns [ArrayList<Float> value = new ArrayList<Float>()] : ^( LISTA_INST (a= sentence )* ) ;
    public final ArrayList<Float> entrada() throws RecognitionException {
        ArrayList<Float> value =  new ArrayList<Float>();


        Float a =null;


        try {
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:69:3: ( ^( LISTA_INST (a= sentence )* ) )
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:69:5: ^( LISTA_INST (a= sentence )* )
            {
            match(input,LISTA_INST,FOLLOW_LISTA_INST_in_entrada67); 

            if ( input.LA(1)==Token.DOWN ) {
                match(input, Token.DOWN, null); 
                // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:69:18: (a= sentence )*
                loop1:
                do {
                    int alt1=2;
                    int LA1_0 = input.LA(1);

                    if ( (LA1_0==ABRIRCORCHETE||(LA1_0 >= ASIGNACION && LA1_0 <= ASTERISCO)||LA1_0==CAMBIO_SIGNO||LA1_0==ID||(LA1_0 >= MAS && LA1_0 <= MENOS)||LA1_0==NUMERO||(LA1_0 >= SLASH && LA1_0 <= DEF_FUNCION)||LA1_0==LLAMADA_FUN) ) {
                        alt1=1;
                    }


                    switch (alt1) {
                	case 1 :
                	    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:69:19: a= sentence
                	    {
                	    pushFollow(FOLLOW_sentence_in_entrada74);
                	    a=sentence();

                	    state._fsp--;


                	     if (!a.isNaN()) value.add(a); 

                	    }
                	    break;

                	default :
                	    break loop1;
                    }
                } while (true);


                match(input, Token.UP, null); 
            }


            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }

        finally {
        	// do for sure before leaving
        }
        return value;
    }
    // $ANTLR end "entrada"



    // $ANTLR start "sentence"
    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:72:1: sentence returns [Float value = new Float(Float.NaN)] : ( ^( ASIGNACION ID expr ) | expr | fundef );
    public final Float sentence() throws RecognitionException {
        Float value =  new Float(Float.NaN);


        MiArbol ID1=null;
        MiArbol ASIGNACION3=null;
        float expr2 =0.0f;

        float expr4 =0.0f;


        try {
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:73:3: ( ^( ASIGNACION ID expr ) | expr | fundef )
            int alt2=3;
            switch ( input.LA(1) ) {
            case ASIGNACION:
                {
                alt2=1;
                }
                break;
            case ABRIRCORCHETE:
            case ASTERISCO:
            case CAMBIO_SIGNO:
            case ID:
            case MAS:
            case MENOS:
            case NUMERO:
            case SLASH:
            case LLAMADA_FUN:
                {
                alt2=2;
                }
                break;
            case DEF_FUNCION:
                {
                alt2=3;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 2, 0, input);

                throw nvae;

            }

            switch (alt2) {
                case 1 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:73:5: ^( ASIGNACION ID expr )
                    {
                    ASIGNACION3=(MiArbol)match(input,ASIGNACION,FOLLOW_ASIGNACION_in_sentence99); 

                    match(input, Token.DOWN, null); 
                    ID1=(MiArbol)match(input,ID,FOLLOW_ID_in_sentence101); 

                    pushFollow(FOLLOW_expr_in_sentence103);
                    expr2=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 


                     ArrayList<Float> aux = variables.get((ID1!=null?ID1.getText():null));
                                                if (aux == null)
                                                  aux = new ArrayList<Float>();
                                                aux.add(0, new Float(expr2));
                                                variables.put((ID1!=null?ID1.getText():null), aux); 
                                                System.out.println("Resultado: " + (ID1!=null?ID1.getText():null) + " = " + expr2);
                                                ASIGNACION3.setValor(expr2);
                                                value = new Float(expr2); 

                    }
                    break;
                case 2 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:81:5: expr
                    {
                    pushFollow(FOLLOW_expr_in_sentence112);
                    expr4=expr();

                    state._fsp--;


                     System.out.println("Resultado: " + expr4); value = new Float(expr4); 

                    }
                    break;
                case 3 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:82:5: fundef
                    {
                    pushFollow(FOLLOW_fundef_in_sentence120);
                    fundef();

                    state._fsp--;


                    }
                    break;

            }
        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }

        finally {
        	// do for sure before leaving
        }
        return value;
    }
    // $ANTLR end "sentence"



    // $ANTLR start "expr"
    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:85:1: expr returns [float value = 0] : ( ^( MAS a= expr b= expr ) | ^( MENOS a= expr b= expr ) | ^( CAMBIO_SIGNO a= expr ) | ^( ASTERISCO a= expr b= expr ) | ^( SLASH a= expr b= expr ) | ID | NUMERO | ^( ABRIRCORCHETE a= expr ) | funcall );
    public final float expr() throws RecognitionException {
        float value =  0;


        MiArbol MAS5=null;
        MiArbol MENOS6=null;
        MiArbol CAMBIO_SIGNO7=null;
        MiArbol ASTERISCO8=null;
        MiArbol SLASH9=null;
        MiArbol ID10=null;
        MiArbol NUMERO11=null;
        MiArbol ABRIRCORCHETE12=null;
        float a =0.0f;

        float b =0.0f;

        float funcall13 =0.0f;


        try {
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:86:3: ( ^( MAS a= expr b= expr ) | ^( MENOS a= expr b= expr ) | ^( CAMBIO_SIGNO a= expr ) | ^( ASTERISCO a= expr b= expr ) | ^( SLASH a= expr b= expr ) | ID | NUMERO | ^( ABRIRCORCHETE a= expr ) | funcall )
            int alt3=9;
            switch ( input.LA(1) ) {
            case MAS:
                {
                alt3=1;
                }
                break;
            case MENOS:
                {
                alt3=2;
                }
                break;
            case CAMBIO_SIGNO:
                {
                alt3=3;
                }
                break;
            case ASTERISCO:
                {
                alt3=4;
                }
                break;
            case SLASH:
                {
                alt3=5;
                }
                break;
            case ID:
                {
                alt3=6;
                }
                break;
            case NUMERO:
                {
                alt3=7;
                }
                break;
            case ABRIRCORCHETE:
                {
                alt3=8;
                }
                break;
            case LLAMADA_FUN:
                {
                alt3=9;
                }
                break;
            default:
                NoViableAltException nvae =
                    new NoViableAltException("", 3, 0, input);

                throw nvae;

            }

            switch (alt3) {
                case 1 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:86:5: ^( MAS a= expr b= expr )
                    {
                    MAS5=(MiArbol)match(input,MAS,FOLLOW_MAS_in_expr140); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr146);
                    a=expr();

                    state._fsp--;


                    pushFollow(FOLLOW_expr_in_expr152);
                    b=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 


                     value = a + b;
                                                    MAS5.setValor(a + b); 

                    }
                    break;
                case 2 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:88:7: ^( MENOS a= expr b= expr )
                    {
                    MENOS6=(MiArbol)match(input,MENOS,FOLLOW_MENOS_in_expr164); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr170);
                    a=expr();

                    state._fsp--;


                    pushFollow(FOLLOW_expr_in_expr176);
                    b=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 


                     value = a - b;
                                                       MENOS6.setValor(a - b); 

                    }
                    break;
                case 3 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:90:7: ^( CAMBIO_SIGNO a= expr )
                    {
                    CAMBIO_SIGNO7=(MiArbol)match(input,CAMBIO_SIGNO,FOLLOW_CAMBIO_SIGNO_in_expr188); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr194);
                    a=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 


                     value = -a; 
                                                  CAMBIO_SIGNO7.setValor(-a); 

                    }
                    break;
                case 4 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:92:7: ^( ASTERISCO a= expr b= expr )
                    {
                    ASTERISCO8=(MiArbol)match(input,ASTERISCO,FOLLOW_ASTERISCO_in_expr206); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr212);
                    a=expr();

                    state._fsp--;


                    pushFollow(FOLLOW_expr_in_expr218);
                    b=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 


                     value = a * b;
                                                          ASTERISCO8.setValor(a * b); 

                    }
                    break;
                case 5 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:94:7: ^( SLASH a= expr b= expr )
                    {
                    SLASH9=(MiArbol)match(input,SLASH,FOLLOW_SLASH_in_expr230); 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr236);
                    a=expr();

                    state._fsp--;


                    pushFollow(FOLLOW_expr_in_expr242);
                    b=expr();

                    state._fsp--;


                    match(input, Token.UP, null); 


                     value = a / b;
                                                       SLASH9.setValor(a / b); 

                    }
                    break;
                case 6 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:96:7: ID
                    {
                    ID10=(MiArbol)match(input,ID,FOLLOW_ID_in_expr253); 

                     if (variables.get((ID10!=null?ID10.getText():null)).size() > index) {
                                 Float v = getValor((ID10!=null?ID10.getText():null));
                                 value = v; 
                                 ID10.setValor(v);
                               } else { //Hemos intentado acceder a un valor inexistente
                                 System.out.println("Error de acceso a una valor inexistente");
                                 Tree childNode = ID10.getParent();
                                 for (int aux = index - 1; aux > 1; aux--)
                                   childNode = childNode.getParent();
                                 Tree parent = childNode.getParent();
                                 parent.deleteChild(childNode.getChildIndex());
                               }
                             

                    }
                    break;
                case 7 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:109:7: NUMERO
                    {
                    NUMERO11=(MiArbol)match(input,NUMERO,FOLLOW_NUMERO_in_expr263); 

                     value = Float.parseFloat((NUMERO11!=null?NUMERO11.getText():null));
                                    NUMERO11.setValor(value); 

                    }
                    break;
                case 8 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:111:7: ^( ABRIRCORCHETE a= expr )
                    {
                    ABRIRCORCHETE12=(MiArbol)match(input,ABRIRCORCHETE,FOLLOW_ABRIRCORCHETE_in_expr274); 

                     index++; 

                    match(input, Token.DOWN, null); 
                    pushFollow(FOLLOW_expr_in_expr282);
                    a=expr();

                    state._fsp--;


                     index--; 

                    match(input, Token.UP, null); 


                     value = a;
                                                                             ABRIRCORCHETE12.setValor(a);
                                                                           

                    }
                    break;
                case 9 :
                    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:114:7: funcall
                    {
                    pushFollow(FOLLOW_funcall_in_expr295);
                    funcall13=funcall();

                    state._fsp--;


                     value = funcall13; 

                    }
                    break;

            }
        }
        catch (ArithmeticException ae) {

                value = 0;
              
        }

        finally {
        	// do for sure before leaving
        }
        return value;
    }
    // $ANTLR end "expr"



    // $ANTLR start "fundef"
    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:120:1: fundef : ^( DEF_FUNCION ID ( . )+ ) ;
    public final void fundef() throws RecognitionException {
        MiArbol DEF_FUNCION14=null;
        MiArbol ID15=null;

        try {
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:120:8: ( ^( DEF_FUNCION ID ( . )+ ) )
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:120:10: ^( DEF_FUNCION ID ( . )+ )
            {
            DEF_FUNCION14=(MiArbol)match(input,DEF_FUNCION,FOLLOW_DEF_FUNCION_in_fundef317); 

            match(input, Token.DOWN, null); 
            ID15=(MiArbol)match(input,ID,FOLLOW_ID_in_fundef319); 

            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:120:27: ( . )+
            int cnt4=0;
            loop4:
            do {
                int alt4=2;
                int LA4_0 = input.LA(1);

                if ( ((LA4_0 >= ABRIRCORCHETE && LA4_0 <= LLAMADA_FUN)) ) {
                    alt4=1;
                }
                else if ( (LA4_0==UP) ) {
                    alt4=2;
                }


                switch (alt4) {
            	case 1 :
            	    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:120:27: .
            	    {
            	    matchAny(input); 

            	    }
            	    break;

            	default :
            	    if ( cnt4 >= 1 ) break loop4;
                        EarlyExitException eee =
                            new EarlyExitException(4, input);
                        throw eee;
                }
                cnt4++;
            } while (true);


            match(input, Token.UP, null); 


             DEF_FUNCION14.setLinea(ID15.getLine());
                                       DEF_FUNCION14.setColumna(ID15.getColumna()); 

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }

        finally {
        	// do for sure before leaving
        }
        return ;
    }
    // $ANTLR end "fundef"



    // $ANTLR start "funcall"
    // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:124:1: funcall returns [float value = 0] : ^( LLAMADA_FUN ID a= expr ) ;
    public final float funcall() throws RecognitionException {
        float value =  0;


        MiArbol ID16=null;
        MiArbol LLAMADA_FUN17=null;
        float a =0.0f;


        try {
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:125:3: ( ^( LLAMADA_FUN ID a= expr ) )
            // C:\\Users\\Jose\\workspace\\p12\\src\\practica\\analizadoresAntlr\\ExpresionesEvaluator.g:125:5: ^( LLAMADA_FUN ID a= expr )
            {
            LLAMADA_FUN17=(MiArbol)match(input,LLAMADA_FUN,FOLLOW_LLAMADA_FUN_in_funcall348); 

            match(input, Token.DOWN, null); 
            ID16=(MiArbol)match(input,ID,FOLLOW_ID_in_funcall350); 

            pushFollow(FOLLOW_expr_in_funcall356);
            a=expr();

            state._fsp--;


            match(input, Token.UP, null); 


             
                                         MiArbol raiz = buscarFuncion((ID16!=null?ID16.getText():null), a);
                                         if (raiz == null)
                                           System.out.println("No se encuentra " + (ID16!=null?ID16.getText():null) + "(" + a + ")");
                                         else {
                                           ExpresionesEvaluator aa = new ExpresionesEvaluator(raiz, funciones, variables, a);
                                           value = aa.expr();
                                         }
                                         LLAMADA_FUN17.setValor(value);
                                         LLAMADA_FUN17.setLinea(ID16.getLinea());
                                         LLAMADA_FUN17.setColumna(ID16.getColumna());
                                       

            }

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }

        finally {
        	// do for sure before leaving
        }
        return value;
    }
    // $ANTLR end "funcall"

    // Delegated rules


 

    public static final BitSet FOLLOW_LISTA_INST_in_entrada67 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_sentence_in_entrada74 = new BitSet(new long[]{0x00000000016B42D8L});
    public static final BitSet FOLLOW_ASIGNACION_in_sentence99 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_ID_in_sentence101 = new BitSet(new long[]{0x00000000012B4290L});
    public static final BitSet FOLLOW_expr_in_sentence103 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_expr_in_sentence112 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_fundef_in_sentence120 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_MAS_in_expr140 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr146 = new BitSet(new long[]{0x00000000012B4290L});
    public static final BitSet FOLLOW_expr_in_expr152 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_MENOS_in_expr164 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr170 = new BitSet(new long[]{0x00000000012B4290L});
    public static final BitSet FOLLOW_expr_in_expr176 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_CAMBIO_SIGNO_in_expr188 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr194 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_ASTERISCO_in_expr206 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr212 = new BitSet(new long[]{0x00000000012B4290L});
    public static final BitSet FOLLOW_expr_in_expr218 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_SLASH_in_expr230 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr236 = new BitSet(new long[]{0x00000000012B4290L});
    public static final BitSet FOLLOW_expr_in_expr242 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_ID_in_expr253 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_NUMERO_in_expr263 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_ABRIRCORCHETE_in_expr274 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_expr_in_expr282 = new BitSet(new long[]{0x0000000000000008L});
    public static final BitSet FOLLOW_funcall_in_expr295 = new BitSet(new long[]{0x0000000000000002L});
    public static final BitSet FOLLOW_DEF_FUNCION_in_fundef317 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_ID_in_fundef319 = new BitSet(new long[]{0x0000000001FFFFF0L});
    public static final BitSet FOLLOW_LLAMADA_FUN_in_funcall348 = new BitSet(new long[]{0x0000000000000004L});
    public static final BitSet FOLLOW_ID_in_funcall350 = new BitSet(new long[]{0x00000000012B4290L});
    public static final BitSet FOLLOW_expr_in_funcall356 = new BitSet(new long[]{0x0000000000000008L});

}